"""
Case Type   : 资源池化
Case Name   : 缩容工具交互时输入【yes y YES Y】
Create At   : 2024.10
Owner       : chen
Description :
    1.执行缩容，交互时输入yes
    2.扩容恢复环境
    3.执行缩容，交互时输入y
    4.扩容恢复环境
    5.执行缩容，交互时输入YES
    6.扩容恢复环境
    7.执行缩容，交互时输入Y
    8.扩容恢复环境
Expect      :
    1.成功缩容
    2.成功扩容
    3.成功缩容
    4.成功扩容
    5.成功缩容
    6.成功扩容
    7.成功缩容
    8.成功扩容
"""

import os
import unittest
from testcase.utils.Logger import Logger
from yat.test import Node
from yat.test import macro

class SharedStorage(unittest.TestCase):
    def setUp(self):
        self.log = Logger()
        self.log.info(f'-----{os.path.basename(__file__)} start-----')
        self.pri_node = Node('PrimaryDbUser')
        self.sta2_node = Node('Standby2DbUser')
        self.db_host = self.sta2_node.db_host
        self.s_user = self.pri_node.ssh_user
        self.pri_root_node = Node('PrimaryRoot')
        
    def test_shared_storage(self):
        param_list = ['YES', 'yes', 'Y', 'y']
        for i in range(4):
            text = f'''-----step{(2*i)+1}: 执行缩容，交互时输入{param_list[i]} expect: 成功-----'''
            self.log.info(text)
            cmd = f'''source {macro.DB_ENV_PATH};
            expect <<EOF
            set timeout 600
            spawn gs_dropnode -U {self.s_user} -G {self.s_user} \
                -h {self.db_host}
            expect "*drop the target node (yes/no)?*"
            send "{param_list[i]}\\n"
            expect eof\n''' + '''EOF'''
            self.log.info(cmd)
            res = self.pri_node.sh(cmd).result()
            self.log.info(res)
            self.assertIn('[gs_dropnode] Success to drop the target nodes', res)
            cmd = f'source {macro.DB_ENV_PATH}; gs_uninstall --delete-data'
            self.log.info(cmd)
            res = self.sta2_node.sh(cmd).result()
            self.log.info(res)

            text = f'''-----step{(2*i)+2}: 扩容恢复环境 expect: 成功-----'''
            self.log.info(text)
            xml_path = macro.DB_XML_PATH
            cmd = f'''gs_expansion -U {self.s_user} -G \
                {self.s_user} -X {xml_path} -h {self.db_host}'''
            execute_cmd = f'''source {macro.DB_ENV_PATH};
            expect <<EOF
            set timeout 300
            spawn {cmd}
            expect "*assword*:"
            send "{self.pri_root_node.ssh_password}\\n"
            expect "*assword*:"
            send "{self.pri_root_node.ssh_password}\\n"
            expect "*lease repeat for database*:"
            send "{macro.GAUSSDB_INIT_USER_PASSWD}\\n"
            expect eof\n''' + '''EOF'''
            self.log.info(execute_cmd)
            res = self.pri_root_node.sh(execute_cmd).result()
            self.log.info(res)
            self.assertIn(f'{self.db_host}:\tSuccess', res)

    def tearDown(self):
        self.log.info(f'-----{os.path.basename(__file__)} end-----')